Mutex & Semaphor

Thread(스레드) 동기화와 세마포어(Semaphore)
Critical Section(임계 구역)에 대한 접근을 막기 위해서 Locking 메커니즘이 필요하다.
Mutex(binary semaphore)
    임계구역에 하나의 스레드만 들어갈 수 있다.
Semaphor
    임계구역에 여러 스레드가 들어갈 수 있다.
    counter를 두어서 동시에 리소스에 접근 할 수 있는 허용 가능한 스레드 수를 제어
세마포어(Semaphore) with pseudo code — 함수로 구현되어 있음
P: 검사(임계 영역에 들어갈 떄)
    S값이 1이상이면, 임계 영역 진입 후, S값 1차감(S값이 0이면 대기)
V: 증가(임계 영역에서 나올 때)
    S값을 1더하고, 임계 영역을 나옴
S: 세마포어 값(초기 값만큼 여러 프로세스가 동시 임계 영역 접근 가능)
pseudo code
P(S): wait(S){ //similar with lock.acquire()
while S<=0 //
;
S--; //
}
V(S): signal(S) { //similar with lock.release()
S++; //
}
세마포어(Semaphore)-바쁜 대기
wait()은 S가 0이 아니라면, 임계 영역에 들어가기 위해, 반복문 수행
    바쁜 대기, busy waiting    -> CPU loop로 인해 성능 저하
세마포어(Semaphore)-대기큐
S가 음수일 경우, 바쁜 대기 대신, 대기큐에 넣는다.
wait(S){
S->count--;
if(S->count<=0){
add this process to S->queue;
block() //ex) sleep()
}
}
signal(S){
S->count++;
if(S->count<=1){
remove a process P from S->queue;
wakeup(P);
}
}
주요 세마포어 함수(POSIX 세마포어)-Linux
sem_open(): 세마포어 생성
sem_wait(): 임계영역 접근 전, 세마포어를 잠그고, 세마포어가 잠겨있다면, 풀릴때 까지 대기(P)
sem_post(): 공유 자원에 대한 접근이 끝날을 때, 세마포어 잠금을 해제(